package server.picfet;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.PrintWriter;

public class VisFeaExtract {
	public void ExtractVisualFeature(String SourceFile, PrintWriter  file01, PrintWriter   file02, PrintWriter   file03, PrintWriter   file04) throws IOException
	{
		CVisFeaExtract VFExt = new CVisFeaExtract();
		File sourceFile = new File(SourceFile);
		String FileTitle = sourceFile.getName();
		if (VFExt.LoadImage(SourceFile))	//是图像文件
		{
			int nBegin, nEnd;
	
			System.out.print("Extracting Features: " + SourceFile);
			
			file01.print(FileTitle);
			file02.print(FileTitle);
			file03.print(FileTitle);
			file04.print(FileTitle);

			//计算颜色直方图,166维
			VFExt.ExtractHistogram();
			int i = 0;
			for(i=0;i<166;i++)
			{
		
				String str = (i + 1) + ":" +  VFExt.m_hist[i];
				file01.print(" " + str);
			}
			file01.println();

			//计算颜色矩,25*9=225维
//			VFExt.ExtractColorMoments();
//			
//			for(i=0;i<25;i++)//输出颜色矩
////				fprintf( file02, " %d:%f", i + 1, VFExt.m_moment1A[i]);
//				file02.print(" " + (i + 1) + ":" + VFExt.m_moment1A[i]);
//			for(i=0;i<25;i++)
////				fprintf( file02, " %d:%f", i + 1 + 25, VFExt.m_moment1B[i]);
//				file02.print(" " + (i + 1 + 25) + ":" + VFExt.m_moment1B[i]);
//			for(i=0;i<25;i++)
////				fprintf( file02, " %d:%f", i + 1 +25*2, VFExt.m_moment1L[i]);
//				file02.print(" " + (i + 1 + 25 * 2) + ":" + VFExt.m_moment1L[i]);
//			for(i=0;i<25;i++)
////				fprintf( file02, " %d:%f", i + 1 +25*3, VFExt.m_moment2A[i]);
//				file02.print(" " + (i + 1 + 25 * 3) + ":" + VFExt.m_moment2A[i]);
//			for(i=0;i<25;i++)
////				fprintf( file02, " %d:%f", i + 1 +25*4, VFExt.m_moment2B[i]);
//				file02.print(" " + (i + 1 + 25 * 4) + ":" + VFExt.m_moment2B[i]);
//			for(i=0;i<25;i++)
////				fprintf( file02, " %d:%f", i + 1 +25*5, VFExt.m_moment2L[i]);
//				file02.print(" " + (i + 1 + 25 * 5) + ":" + VFExt.m_moment2L[i]);
//
//			for(i=0;i<25;i++)
////				fprintf( file02, " %d:%f", i + 1 +25*6, VFExt.m_moment3A[i]);
//				file02.print(" " + (i + 1 + 25 * 6) + ":" + VFExt.m_moment3A[i]);
//			for(i=0;i<25;i++)
////				fprintf( file02, " %d:%f", i + 1 +25*7, VFExt.m_moment3B[i]);
//				file02.print(" " + (i + 1 + 25 * 7) + ":" + VFExt.m_moment3B[i]);
//			for(i=0;i<25;i++)
////				fprintf( file02, " %d:%f", i + 1 +25*8, VFExt.m_moment3L[i]);
//				file02.print(" " + (i + 1 + 25 * 8) + ":" + VFExt.m_moment3L[i]);
////			fprintf(file02,"\n");
//			file02.println();

			//计算颜色相关图,166维
			//_CrtDumpMemoryLeaks();
			VFExt.ExtractColorCorrelogram();
			for(i=0;i<166;i++)//输出颜色相关图
			{
//				fprintf( file03, " %d:%f", i + 1, VFExt.m_correlogram[i]);
				file03.print(" " + (i + 1) + ":" + VFExt.m_correlogram[i]);
			}
//			fprintf(file03,"\n");
			file03.println();

			//计算边缘直方图,5*8*8=320维
//			VFExt.ExtractEdgeHistogram();
//			for(i = 0; i < 5; i ++)//输出边缘直方图
//				for(int j = 0; j < 8; j ++)
//					for(int k = 0; k < 8; k ++)
//					{
//						int nNum = (i * 8  + j) * 8 + k + 1;
////						fprintf( file04, " %d:%d", nNum, VFExt.m_EdgeHistogram[i][j][k]);
//						file04.print(" " + nNum + ":" + VFExt.m_EdgeHistogram[i][j][k]);
//					}
////					fprintf(file04,"\n");
//			file04.println();

			VFExt.ReleaseImage();
		}
	}
	
	public void ExtractVisualFeature(String SourceFile, PrintWriter  file01, PrintWriter   file02, PrintWriter   file03, PrintWriter   file04, PrintWriter file05, PrintWriter file06) throws IOException
	{
		CVisFeaExtract VFExt = new CVisFeaExtract();
		File sourceFile = new File(SourceFile);
		String FileTitle = sourceFile.getName();
		if (VFExt.LoadImage(SourceFile))	//是图像文件
		{
			int nBegin, nEnd;
	
			System.out.print("Extracting Features: " + SourceFile);
			
			file01.print(FileTitle);
			file02.print(FileTitle);
			file03.print(FileTitle);
			file04.print(FileTitle);

			//计算颜色直方图,166维
			VFExt.ExtractHistogram();
			for(int i=0;i<166;i++)
			{
		
				String str = (i + 1) + ":" +  VFExt.m_hist[i];
				file01.print(str);
			}
			file01.println();

			//计算颜色矩,25*9=225维
			VFExt.ExtractColorMoments();
			for(int i=0;i<25;i++)//输出颜色矩
//				fprintf( file02, " %d:%f", i + 1, VFExt.m_moment1A[i]);
				file02.print("" + (i + 1) + ":" + VFExt.m_moment1A[i]);
			for(int i=0;i<25;i++)
//				fprintf( file02, " %d:%f", i + 1 + 25, VFExt.m_moment1B[i]);
				file02.print("" + (i + 1 + 25) + ":" + VFExt.m_moment1B[i]);
			for(int i=0;i<25;i++)
//				fprintf( file02, " %d:%f", i + 1 +25*2, VFExt.m_moment1L[i]);
				file02.print("" + (i + 1 + 25 * 2) + ":" + VFExt.m_moment1L[i]);
			for(int i=0;i<25;i++)
//				fprintf( file02, " %d:%f", i + 1 +25*3, VFExt.m_moment2A[i]);
				file02.print("" + (i + 1 + 25 * 3) + ":" + VFExt.m_moment2A[i]);
			for(int i=0;i<25;i++)
//				fprintf( file02, " %d:%f", i + 1 +25*4, VFExt.m_moment2B[i]);
				file02.print("" + (i + 1 + 25 * 4) + ":" + VFExt.m_moment2B[i]);
			for(int i=0;i<25;i++)
//				fprintf( file02, " %d:%f", i + 1 +25*5, VFExt.m_moment2L[i]);
				file02.print("" + (i + 1 + 25 * 5) + ":" + VFExt.m_moment2L[i]);

			for(int i=0;i<25;i++)
//				fprintf( file02, " %d:%f", i + 1 +25*6, VFExt.m_moment3A[i]);
				file02.print("" + (i + 1 + 25 * 6) + ":" + VFExt.m_moment3A[i]);
			for(int i=0;i<25;i++)
//				fprintf( file02, " %d:%f", i + 1 +25*7, VFExt.m_moment3B[i]);
				file02.print("" + (i + 1 + 25 * 7) + ":" + VFExt.m_moment3B[i]);
			for(int i=0;i<25;i++)
//				fprintf( file02, " %d:%f", i + 1 +25*8, VFExt.m_moment3L[i]);
				file02.print("" + (i + 1 + 25 * 8) + ":" + VFExt.m_moment3L[i]);
//			fprintf(file02,"\n");
			file02.println();

			//计算颜色相关图,166维
			//_CrtDumpMemoryLeaks();
			VFExt.ExtractColorCorrelogram();
			for(int i=0;i<166;i++)//输出颜色相关图
			{
//				fprintf( file03, " %d:%f", i + 1, VFExt.m_correlogram[i]);
				file03.print("" + (i + 1) + ":" + VFExt.m_correlogram[i]);
			}
//			fprintf(file03,"\n");
			file03.println();
			

			//计算边缘直方图,5*8*8=320维
			VFExt.ExtractEdgeHistogram();
			for(int i = 0; i < 5; i ++)//输出边缘直方图
				for(int j = 0; j < 8; j ++)
					for(int k = 0; k < 8; k ++)
					{
						int nNum = (i * 8  + j) * 8 + k + 1;
//						fprintf( file04, " %d:%d", nNum, VFExt.m_EdgeHistogram[i][j][k]);
						file04.print("" + nNum + ":" + VFExt.m_EdgeHistogram[i][j][k]);
					}
			file04.println();

			//计算共生纹理,24*4=96维
			VFExt.ExtractTextureCooccurence();
			for(int i=0;i<24;i++)//输出共生纹理的四个特征
//				fprintf( file05, " %d:%f", i + 1, VFExt.m_Contrast[i]);
				file05.print("" + (i + 1) + ":" + VFExt.m_Contrast[i]);
			for(int i=0;i<24;i++)
//				fprintf( file05, " %d:%f", i + 1 +24, VFExt.m_Correlation[i]);
				file05.print("" + (i + 1 + 24) + ":" + VFExt.m_Correlation[i]);
			for(int i=0;i<24;i++)
//				fprintf( file05, " %d:%f", i + 1 +24*2, VFExt.m_Energy[i]);
				file05.print("" + (i + 1 + 24 * 2) + ":" + VFExt.m_Energy[i]);
			for(int i=0;i<24;i++)
//				fprintf( file05, " %d:%f", i + 1 +24*3, VFExt.m_Entropy[i]);
				file05.print("" + (i + 1 + 24 * 3) + ":" + VFExt.m_Entropy[i]);
//			fprintf(file05,"\n");
			file05.println();

			//计算haar小波纹理,108维
			VFExt.ExtractHaarWavelet();
			for(int i=0;i<108;i++)//输出haar小波纹理
//				fprintf(file06," %d:%f",i + 1,VFExt.m_waveletfeature[i]);
				file06.print("" + (i + 1 ) + ":" + VFExt.m_waveletfeature[i]);
//			fprintf(file06,"\n");jpg
			file06.println();

			VFExt.ReleaseImage();
		}
	}
	
	public static void main(String[] args) {
		VisFeaExtract vfe = new VisFeaExtract();
		PrintWriter file01 = null;
		PrintWriter file02 = null;
		PrintWriter file03 = null;
		PrintWriter file04 = null;
		try {
			file01 = new PrintWriter("file01");
			file02 = new PrintWriter("file02");
			file03 = new PrintWriter("file03");
			file04 = new PrintWriter("file04");
			vfe.ExtractVisualFeature("1364543136200.jpg", file01, file02, file03, file04);
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		finally{
			file01.close();
			file02.close();
			file03.close();
			file04.close();
		}
		
	}
}
